package code.c03_stackQueue.linkQueue;

/**
 * @author thinkpad - 83start
 * @version v1.0
 * @create 2022/10/7 17:42
 * @package code.c03_stackQueue.linkQueue
 * @description 采用一个不带头结点只有一个尾结点指定rear 的循环单链表存储队列，设计出
 * 这个链队的进队，出队，判断空和求队中元素的算法。
 */

public class Exam_3_13{

}

class LinkQueueClass1<E>{
    LinkNode<E> rear;

    public LinkQueueClass1() {
        rear = null;
    }

    /**
     * 判断是否为空
     * @return
     */
    public boolean empty(){
        return rear == null;
    }

    /**
     * 入栈操作
     * @param e
     */
    public void push(E e){
        LinkNode<E> s = new LinkNode<E>(e);
        if (rear == null){// 原链队为空
            s.next =s;
            rear =s;
        }else {// 队列中有元素时
            s.next = rear.next;
            rear.next = s;
            rear = s;
        }
    }

    /**
     * 出栈操作
     * @return
     */
    public E pop(){
        E e;
        if (empty()){
            throw new IllegalArgumentException("队空");
        }
        if (rear.next == rear){// 如果队列中只有一个元素
            e = rear.data;
            rear = null;
        }else {// 如果队列中有多个元素
            e = rear.next.data;
            rear.next = rear.next.next;
        }
        return e;
    }

    /**
     * 获取栈顶元素
     * @return
     */
    public E peek(){
        if (empty()){
            throw new IllegalArgumentException("队空");
        }
        if (rear.next == rear){// 如果队列中只有一个元素
            return rear.data;

        }else {// 如果队列中有多个元素
            return rear.next.data;
        }
    }
}
